一、什么是装饰器

	装饰器：就是一个方法，可以注入到类、方法、属性参数上来"扩展"类、属性、方法、参数的功能。 

	参考文章：https://www.xuexiluxian.cn/blog/detail/b2a537cc56884d0aa9dc338d406603b4

二、使用装饰器

	注意：如果要使用装饰器，必须在tsconfig.json中进行 "experimentalDecorators":true,配置

	2.1 类装饰器 ( 无法传递参数 )

		function fun1( target:any ){
		    target.prototype.userName = '张三';
		    target.age = 19;
		}
		@fun1
		class Person1{
		}
		let p1 = new Person1();
		//@ts-ignore
		console.log( p1.userName );
		//@ts-ignore
		console.log( Person1.age );

		//这里的@fun1 ==》 @fun1(Person1)

	2.2 装饰器工厂

		function fun2( options:any ){
		    return function( target:any ){
		        target.prototype.userName = options.name;
		        target.prototype.userAge = options.age;
		    }
		}
		@fun2({
		    name:'张三',
		    age:18
		})
		class Person2{

		}

		let p2 = new Person2();
		//@ts-ignore
		console.log( p2.userName ,p2.userAge );

	2.3 装饰器组合

		function demo1( target:any ){
		    console.log('demo1');
		}
		function demo2(){
		    console.log('demo2');
		    return function(target:any){
		        console.log('demo2 内部');
		    }
		}
		function demo3(){
		    console.log('demo3');
		    return function(target:any){
		        console.log('demo3 内部');
		    }
		}
		function demo4( target:any ){
		    console.log('demo4');
		}

		@demo1
		@demo2()
		@demo3()
		@demo4
		class Person3{

		}
		let p3 = new Person3();

		***执行顺序：结合起来一起使用的时候, 会先 从上至下 的执行所有的装饰器工厂, 拿到所有真正的装饰器, 然后再 从下至上 的执行所有的装饰器。


	2.4 属性装饰器

		function fun4( options:any ){
		    return function(target:any , attr:any){
		        target[attr] = options;
		    }
		}
		class Person4{
		    //@ts-ignore
		    @fun4('李四')
		    //@ts-ignore
		    userName:string;
		}

		let p4 = new Person4();
		console.log( p4.userName );

	2.5 方法装饰器

		

